/**
 * 
 */
package com.rtsp.tool.snatch04;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * @author w.weizhen
 * 
 */
public class RunnableMain04 {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		JSONArray datas = new JSONArray();
		
		datas.add(JSON.parseObject("{code:'L12051310', url:'rtsp://admin:19870513qq@192.168.12.104:554/Streaming/Channels/101'}"));
		datas.add(JSON.parseObject("{code:'135152559', url:'rtsp://admin:88888888b@192.168.12.105:554/Streaming/Channels/101'}"));
		datas.add(JSON.parseObject("{code:'F93882634', url:'rtsp://admin:88888888b@192.168.12.106:554/Streaming/Channels/101'}"));
		
		// 单播、多播
//		datas.add(JSON.parseObject("{code:'L12051310', url:'rtsp://admin:19870513qq@192.168.12.104:554/Streaming/Channels/101?transportmode=unicast'}"));
//		datas.add(JSON.parseObject("{code:'135152559', url:'rtsp://admin:88888888b@192.168.12.105:554/Streaming/Channels/101?transportmode=unicast'}"));
//		datas.add(JSON.parseObject("{code:'F93882634', url:'rtsp://admin:88888888b@192.168.12.106:554/Streaming/Channels/101?transportmode=multicast'}"));
		
//		datas.add(JSON.parseObject("{code:'L12051310', url:'rtsp://admin:19870513qq@192.168.12.104:554/h264/ch1/main/av_stream'}"));
//		datas.add(JSON.parseObject("{code:'135152559', url:'rtsp://admin:88888888b@192.168.12.105:554/h264/ch1/main/av_stream'}"));
//		datas.add(JSON.parseObject("{code:'F93882634', url:'rtsp://admin:88888888b@192.168.12.106:554/h264/ch1/main/av_stream'}"));
		
		
		//  如果在任务的执行中遇到异常，后续执行被取消。
		
		// 使用Executors.newSingleThreadScheduledExecutor()来创建线程池同时放入多个线程时，每个线程都会按照自己的调度来执行，
		// 但是当其中一个线程被阻塞时，其它的线程都会受到影响被阻塞，不过依然都会按照自身调度来执行，但是会存在阻塞延迟。
		ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
		for (int i = 0; i < datas.size(); i++) 
		{
			JSONObject data = datas.getJSONObject(i);
			RtspSnatchRunnable04 tsr = new RtspSnatchRunnable04(data.getString("code"), data.getString("url"));
			service.scheduleAtFixedRate(tsr, 5, 100, TimeUnit.MILLISECONDS);
		}
		
//		// 创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
//		ExecutorService service = Executors.newCachedThreadPool();
//		for (int i = 0; i < 100; i++) 
//		{
//			service.execute(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						System.out.println("xxx");
//						Thread.sleep(10000);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//			});
//		}
		
//		// 创建一个定长线程池，可控制线程最大并发数，超出线程会在队列中等待，
//		// 定长线程池大小最好根据系统资源进行设置，如Runtime.getRuntime()availableProcessors();
//		ExecutorService service = Executors.newFixedThreadPool(5);
//		for (int i = 0; i < 100; i++) 
//		{
//			service.execute(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						System.out.println("xxx");
//						Thread.sleep(10000);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//			});
//		}
		
		
//		// 创建定长线程池，支持定时和周期任务，延迟执行
//		ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
//		for (int i = 0; i < 100; i++) 
//		{
//			// 延时
//			service.schedule(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						System.out.println("xxx");
//						Thread.sleep(10000);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//			}, 5, TimeUnit.SECONDS);
//			// 延时 周期
//			service.scheduleAtFixedRate(new Runnable() {
//				@Override
//				public void run() {
//					try {
//						System.out.println("xxx");
//						Thread.sleep(10000);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//			}, 5, 100, TimeUnit.MILLISECONDS);
//			
//		}
		
//		// 创建定长线程池，支持定时和周期任务，延迟执行
//		ScheduledExecutorService service = Executors.newScheduledThreadPool(30);
//		for (int i = 0; i < datas.size(); i++) 
//		{
//			JSONObject data = datas.getJSONObject(i);
//			RtspSnatchRunnable04 tsr = new RtspSnatchRunnable04(data.getString("code"), data.getString("url"));
//			service.scheduleAtFixedRate(tsr, 5, 100, TimeUnit.MILLISECONDS);
//		}
		
		
	}
}